package kotlinquanweizhinan.chapt05匿名函数与函数类型.匿名函数.函数类型

class SimVillage {
}

fun main() {

    /**
     * 定义字符串就是把字符放在一对引号是间。
     * 类似地，定义函数就是把表达式或语句放在一对花括号里。
     * 这里，首先调用println函数。在一对花托号里定义一个匿名函数，将其放在println函数的参数圆
     * 括号里。匿名函数里定义了一个变量，返回一条欢迎字符串信息。
     *
    {
    val currentYear = 2018
    "Welcom to SimVillage,Mayor!(copyright $currentYear)"
    }()
     我们在花括号的后面跟上一对空的圆括号，表示调用匿名函数。圆括号不能省，否则就不会输出欢迎信息。
     和具名函数一样，要让匿名函数工作，就得调用它，并在参数圆括号里传入对应的值参(没参数就空着)
     */

    println({
        val currentYear = 2018
        "Welcom to SimVillage,Mayor!(copyright $currentYear)"
    }())

    //匿名函数也有类型，我们称其为函数类型(function type)。匿名函数可以当作变量值赋给函数类型变量。然后，就像其他变量一样，匿名函数就可以在代码里传递了。

    //定义一个存储函数的变量，把输出欢迎语句的匿名函数赋给它。
    val greetingFunction:() ->String = {
        val currentYear = 2022
        "Welcome to SimVillage,Mayor!(copyright $currentYear)"
    }

    /**
     * () -> String是给greetingFunction变量指定的函数类型定义，它告诉编译器，任何
     * 不需要参数（以圆括号表示）、能返回String的函数，都可赋给greetingFunction变量。
     * 和变量的类型定义一样，无论匿名函数是赋给greetingFunction变量，还是作为值参传递，
     * 编译器都会进行检查以确保它的类型满足要求。
     */
    println(greetingFunction())
}